/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Principal.java
 *
 * Created on 29-oct-2011, 1:33:58
 */
package Ventanas;

import Controladores.Memoria;
import Interfaces.Factory;
import Interfaces.ICtrlPersistencia;
import Objetos.PropiedadesIP;
import ObjetosJpa.BandejaSalidaJpa;
import ObjetosJpa.MensajeJpa;
import ObjetosJpa.UsuarioJpa;
import Proxies.CtrlChatWS;
import Proxies.CtrlChatWSService;
import Proxies.CtrlConexionesWS;
import Proxies.CtrlConexionesWSService;
import Proxies.CtrlMovilWS;
import Proxies.CtrlMovilWSService;
import Proxies.CtrlUsuariosWS;
import Proxies.CtrlUsuariosWSService;
import Proxies.DataConexion;
import Proxies.DataHistorial;
import Proxies.DataMensaje;
import Proxies.DataUsuario;
import Proxies.DataUsuarioArray;
import Proxies.EnumTipoAplicacion;
import Proxies.StringArray;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.xml.namespace.QName;

/**
 *
 * @author Sebas
 */
public class Principal extends javax.swing.JFrame {

    private String mailIngresado;
    private String passIngresado;
    private boolean conectado = false;
    private ArrayList<Conversacion> conversaciones;
    private HashMap<String,DataHistorial> historiales;
    private DataUsuario usuario = new DataUsuario();
    private UsuarioJpa usuarioJpa = new UsuarioJpa();
    ICtrlPersistencia ctrlPers = Factory.getInstance().getCtrlPersistencia();

    /** Creates new form Principal */
    public Principal() {
        initComponents();
        conversaciones = new ArrayList<Conversacion>();
        historiales = new HashMap<String, DataHistorial>();
    }

    public Principal(String titulo) {
        this.setTitle(titulo);
        initComponents();
        conversaciones = new ArrayList<Conversacion>();
        historiales = new HashMap<String, DataHistorial>();
        
//        AgregarHistorial hist = new AgregarHistorial();
//        hist.start();
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel_usrLogueado = new javax.swing.JLabel();
        jLabel_estado = new javax.swing.JLabel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu_Dispositivo = new javax.swing.JMenu();
        jMenuItem_encendDisp = new javax.swing.JMenuItem();
        jMenuItem_apagDisp = new javax.swing.JMenuItem();
        jMenuItem_conectDesconDisp = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenu_amigos = new javax.swing.JMenu();
        jMenuItem_ListarAmigos = new javax.swing.JMenuItem();
        jMenuItem_IniciarConversa = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setBackground(new java.awt.Color(153, 153, 255));

        jLabel_usrLogueado.setText("Dispositivo apagado");

        jLabel_estado.setText("DESCONECTADO");

        jMenu_Dispositivo.setText("Dispositivo");
        jMenu_Dispositivo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jMenu_DispositivoMouseClicked(evt);
            }
        });
        jMenu_Dispositivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenu_DispositivoActionPerformed(evt);
            }
        });

        jMenuItem_encendDisp.setText("Encender dispositivo");
        jMenuItem_encendDisp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_encendDispActionPerformed(evt);
            }
        });
        jMenu_Dispositivo.add(jMenuItem_encendDisp);

        jMenuItem_apagDisp.setText("Apagar dispositivo");
        jMenuItem_apagDisp.setEnabled(false);
        jMenuItem_apagDisp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_apagDispActionPerformed(evt);
            }
        });
        jMenu_Dispositivo.add(jMenuItem_apagDisp);

        jMenuItem_conectDesconDisp.setText("Conectar/Desconectar dispositivo");
        jMenuItem_conectDesconDisp.setEnabled(false);
        jMenuItem_conectDesconDisp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_conectDesconDispActionPerformed(evt);
            }
        });
        jMenu_Dispositivo.add(jMenuItem_conectDesconDisp);

        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK));
        jMenuItem1.setText("Salir");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu_Dispositivo.add(jMenuItem1);

        jMenuBar1.add(jMenu_Dispositivo);

        jMenu_amigos.setText("Amigos");
        jMenu_amigos.setEnabled(false);

        jMenuItem_ListarAmigos.setText("Listar amigos");
        jMenuItem_ListarAmigos.setEnabled(false);
        jMenuItem_ListarAmigos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_ListarAmigosActionPerformed(evt);
            }
        });
        jMenu_amigos.add(jMenuItem_ListarAmigos);

        jMenuItem_IniciarConversa.setText("Iniciar conversacion");
        jMenuItem_IniciarConversa.setEnabled(false);
        jMenuItem_IniciarConversa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_IniciarConversaActionPerformed(evt);
            }
        });
        jMenu_amigos.add(jMenuItem_IniciarConversa);

        jMenuBar1.add(jMenu_amigos);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(184, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel_usrLogueado, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel_estado, javax.swing.GroupLayout.Alignment.TRAILING))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jLabel_usrLogueado)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel_estado)
                .addContainerGap(244, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents


    private void jMenu_DispositivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenu_DispositivoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jMenu_DispositivoActionPerformed

    private void jMenu_DispositivoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jMenu_DispositivoMouseClicked
        // TODO add your handling code here:
    }//GEN-LAST:event_jMenu_DispositivoMouseClicked

    private void jMenuItem_encendDispActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_encendDispActionPerformed
        // TODO add your handling code here:
        Login log = new Login(this, true);
        log.setVisible(true);
        log.setLocationRelativeTo(null);

        Memoria.getInstance().setAmigos(new DataUsuarioArray());
        Memoria.getInstance().setHistoriales(new HashMap<String, DataHistorial>());
        mailIngresado = log.getMail();
        passIngresado = "";
        jLabel_usrLogueado.setText(mailIngresado);
        jMenuItem_encendDisp.setEnabled(false);
        jMenuItem_apagDisp.setEnabled(true);
        jMenuItem_conectDesconDisp.setEnabled(true);
        jMenu_amigos.setEnabled(true);
        jMenuItem_ListarAmigos.setEnabled(true);
        UsuarioJpa aux = ctrlPers.cargarDatos(mailIngresado);
        if(aux!=null)
        {
            usuarioJpa = aux;
        }
    }//GEN-LAST:event_jMenuItem_encendDispActionPerformed

    private void jMenuItem_apagDispActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_apagDispActionPerformed
        // TODO add your handling code here:
        if(conectado)
        desConectar();
        jLabel_usrLogueado.setText("Dispositivo apagado");
        jMenuItem_encendDisp.setEnabled(true);
        jMenuItem_apagDisp.setEnabled(false);
        jMenu_amigos.setEnabled(false);
        jMenuItem_conectDesconDisp.setEnabled(false);
        
       
        usuario.getHistorial().addAll(historiales.values());
        ctrlPers.guardarDatos(usuario);
        ctrlPers.guardarMensajes(mailIngresado, usuario);
        guardarBandejaSalida();
//        ctrlPers.eliminarBase();
        
    }//GEN-LAST:event_jMenuItem_apagDispActionPerformed

    private void jMenuItem_conectDesconDispActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_conectDesconDispActionPerformed
        // TODO add your handling code here:
        PropiedadesIP props = PropiedadesIP.getInstance();
        String IP = props.getServidorCentralIP();
        URL dir = null;
        try {
            dir = new URL(IP + "CtrlUsuarios?wsdl");
        } catch (MalformedURLException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
        QName qNa = new QName("http://WebServices/", "CtrlUsuariosWSService");
        CtrlUsuariosWS us = new CtrlUsuariosWSService(dir, qNa).getCtrlUsuariosWSPort();
        Memoria.getInstance().setAmigos(new CtrlUsuariosWSService(dir, qNa).getCtrlUsuariosWSPort().listarDAmigos(mailIngresado));
        

        if (conectado != true) {
            conectar();
            usuario = us.getUsuario(mailIngresado);
             enviarBandejaSalidaJpa();
             
            
        } else {
            desConectar();
            
        }
    }//GEN-LAST:event_jMenuItem_conectDesconDispActionPerformed

    private void jMenuItem_ListarAmigosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_ListarAmigosActionPerformed
        // TODO add your handling code here:
        ListarAmigos la = new ListarAmigos(this, true, mailIngresado, conectado,this);
        la.setVisible(true);
        la.setLocationRelativeTo(null);
    }//GEN-LAST:event_jMenuItem_ListarAmigosActionPerformed

    private void jMenuItem_IniciarConversaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_IniciarConversaActionPerformed
        // TODO add your handling code here:
        SeleccAmigos selecAmigos = new SeleccAmigos(this, false, mailIngresado, this);
        selecAmigos.setVisible(true);
        selecAmigos.setLocationRelativeTo(null);
    }//GEN-LAST:event_jMenuItem_IniciarConversaActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        // TODO add your handling code here:
        desConectar();
        ctrlPers.close();
        System.exit(0);
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Principal().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel_estado;
    private javax.swing.JLabel jLabel_usrLogueado;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem_IniciarConversa;
    private javax.swing.JMenuItem jMenuItem_ListarAmigos;
    private javax.swing.JMenuItem jMenuItem_apagDisp;
    private javax.swing.JMenuItem jMenuItem_conectDesconDisp;
    private javax.swing.JMenuItem jMenuItem_encendDisp;
    private javax.swing.JMenu jMenu_Dispositivo;
    private javax.swing.JMenu jMenu_amigos;
    // End of variables declaration//GEN-END:variables

    private void conectar() {
        PropiedadesIP props = PropiedadesIP.getInstance();
        String IP = props.getServidorCentralIP();
        try {

            URL dir = new URL(IP + "CtrlUsuarios?wsdl");
            QName qNa = new QName("http://WebServices/", "CtrlUsuariosWSService");
            CtrlUsuariosWSService usrWS = new CtrlUsuariosWSService(dir, qNa);
            CtrlUsuariosWS ctrlUsr = usrWS.getCtrlUsuariosWSPort();

            boolean mailCorrecto = false, passCorrecto = false;
            mailCorrecto = ctrlUsr.containsKey(mailIngresado);
            if (mailCorrecto) {
                passCorrecto = ctrlUsr.coincidePassUsr(mailIngresado, passIngresado);
            }

            while (!mailCorrecto || !passCorrecto) {
                JOptionPane.showMessageDialog(rootPane, "Ooops...\nLogin incorrecto, intente nuevamente");
                Login log = new Login(this, true);
                log.setVisible(true);
                log.setLocationRelativeTo(null);
                mailIngresado = log.getMail();
                //passIngresado = log.getPass();
                passIngresado = "";
                mailCorrecto = ctrlUsr.containsKey(mailIngresado);
                if (mailCorrecto) {
                    passCorrecto = ctrlUsr.coincidePassUsr(mailIngresado, passIngresado);
                }
            }

            InetAddress address = null;
            try {
                address = InetAddress.getLocalHost();
            } catch (UnknownHostException ex) {
                Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
            }

            DataConexion dc = new DataConexion();
            dc.setIp(address.getHostAddress());
            dc.setTipoAplic(EnumTipoAplicacion.MOVIL);
            dc.setUsrLogueado(mailIngresado);
            URL dirConex = new URL(IP + "CtrlConexiones?wsdl");
            QName qNaConex = new QName("http://WebServices/", "CtrlConexionesWSService");
            CtrlConexionesWS ctrlConex = new CtrlConexionesWSService(dirConex, qNaConex).getCtrlConexionesWSPort();
            ctrlConex.agregarConexion(dc);

            JOptionPane.showMessageDialog(rootPane, "El usuario se ha conectado a la red");
            jLabel_estado.setText("CONECTADO");
            jMenu_amigos.setEnabled(true);
            jMenuItem_IniciarConversa.setEnabled(true);
            conectado = true;
            jLabel_usrLogueado.setText(mailIngresado);

            URL dir2 = new URL(IP + "CtrlMovil?wsdl");
            QName qNa2 = new QName("http://WebServices/", "CtrlMovilWSService");
            CtrlMovilWS ctrlMovil = new CtrlMovilWSService(dir2, qNa2).getCtrlMovilWSPort();
            ctrlMovil.conectarUsuario(mailIngresado);
            
            enviarBandeja();
           
            
        } catch (MalformedURLException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void desConectar() {
        try {
            jLabel_estado.setText("DESCONECTADO");
            PropiedadesIP props = PropiedadesIP.getInstance();
            String IP = props.getServidorCentralIP();
            URL dir2 = new URL(IP + "CtrlMovil?wsdl");
            QName qNa2 = new QName("http://WebServices/", "CtrlMovilWSService");
            CtrlMovilWS ctrlMovil = new CtrlMovilWSService(dir2, qNa2).getCtrlMovilWSPort();
            ctrlMovil.desconectarUsuario(mailIngresado);
            conectado = false;
            DataConexion dc = new DataConexion();
            dc.setIp(IP);
            dc.setTipoAplic(EnumTipoAplicacion.MOVIL);
            dc.setUsrLogueado(mailIngresado);
            URL dirConex = new URL(IP + "CtrlConexiones?wsdl");
            QName qNaConex = new QName("http://WebServices/", "CtrlConexionesWSService");
            CtrlConexionesWS ctrlConex = new CtrlConexionesWSService(dirConex, qNaConex).getCtrlConexionesWSPort();
            ctrlConex.quitarConexion(dc);
            jMenuItem_IniciarConversa.setEnabled(false);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public boolean isConectado() {
        return conectado;
    }

    public void setConectado(boolean conectado) {
        this.conectado = conectado;
    }

    public void agregarConversacion(Conversacion conv) {

        conversaciones.add(conv);
    }

    public DataHistorial getHistorial(String amigo){
        
        return historiales.get(amigo);
        
    }

    private void enviarBandeja() {

        Iterator<Conversacion> it = conversaciones.iterator();

        Conversacion aux;
        while (it.hasNext()) {

            aux = it.next();
            aux.enviarBandeja();
        }

    }
    
    private void enviarBandejaSalidaJpa(){
      
        if (usuarioJpa != null) {
            PropiedadesIP props = PropiedadesIP.getInstance();
            String IP = props.getServidorCentralIP();
            URL dirChat = null;
            try {
                dirChat = new URL(IP + "CtrlChat?wsdl");
            } catch (MalformedURLException ex) {
                Logger.getLogger(Conversacion.class.getName()).log(Level.SEVERE, null, ex);
            }
            QName qNaChat = new QName("http://WebServices/", "CtrlChatWSService");
            CtrlChatWS chat = new CtrlChatWSService(dirChat, qNaChat).getCtrlChatWSPort();

            Collection<BandejaSalidaJpa> bs = usuarioJpa.getBandejaSalida();
            Iterator<BandejaSalidaJpa> it = bs.iterator();
            while (it.hasNext()) {

                BandejaSalidaJpa band = it.next();
                Iterator<MensajeJpa> iterator = band.getMensajes().iterator();
                while (iterator.hasNext()) {

                    MensajeJpa men = iterator.next();
                    DataMensaje dmen = new DataMensaje();
                    dmen.setEmisor(men.getEmisor());
                    dmen.setMsj(men.getMsj());
                    chat.send(dmen, band.getChatID());
                }
            }
           ctrlPers.vaciarBandejaSalida(mailIngresado);
        }
    }

    public DataUsuario getUsuario() {
        return usuario;
    }

    public void setUsuario(DataUsuario usuario) {
        this.usuario = usuario;
    }

    public UsuarioJpa getUsuarioJpa() {
        return usuarioJpa;
    }

    public void setUsuarioJpa(UsuarioJpa usuarioJpa) {
        this.usuarioJpa = usuarioJpa;
    }
    
    

    public void agregarMensajeLocal(StringArray amigos,DataMensaje dmen){
        
        Iterator<String> itAmigos = amigos.getItem().iterator();
        DataHistorial hist;
        while(itAmigos.hasNext())
        {
            String amigo = itAmigos.next();
            if(!amigo.equals(mailIngresado))
            {
                if(!historiales.containsKey(amigo))
                {
                    hist = new DataHistorial();
                    hist.setIdAmigo(amigo);
                    historiales.put(amigo, hist);
                }
                hist = historiales.get(amigo);
                hist.getMensajes().add(dmen);
            }
        }
         
            
        }
    
    private void guardarBandejaSalida(){
        
                ctrlPers.guardarBandejaSalida(conversaciones,mailIngresado);
        
    }
}
